// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`any.js 1`] = `
// @flow

function foo(x:any):any { return x; }
function bar(x:any):mixed { return x; }
function qux(x:mixed):any { return x; }

var x:string = foo(0);
var y:string = bar(0);
var z:string = qux(0);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @flow

function foo(x: any): any {
  return x;
}
function bar(x: any): mixed {
  return x;
}
function qux(x: mixed): any {
  return x;
}

var x: string = foo(0);
var y: string = bar(0);
var z: string = qux(0);

`;

exports[`anyexportflowfile.js 1`] = `
// @flow

module.exports = ((x: any) => x: any);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @flow

module.exports = ((x: any) => x: any);

`;

exports[`flowfixme.js 1`] = `
/*
  FlowFixMe is a synonym for any, used by the Flow team to
  signal a needed mod to JS devs.

  @flow
 */

// no param
function foo(x:$FlowFixMe):$FlowFixMe { return x; }
function bar(x:$FlowFixMe):mixed { return x; }
// param (info only)
function qux(x:$FlowFixMe<number>):$FlowFixMe<number> { return x; }
// ...params are still checked. unknown type
function baz(x:$FlowFixMe<nnumber>): $FlowFixMe<number> { return x; }

var x:string = foo(0);
var y:string = bar(0);
var z:string = qux(0);
var w:string = baz(0);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
  FlowFixMe is a synonym for any, used by the Flow team to
  signal a needed mod to JS devs.

  @flow
 */

// no param
function foo(x: $FlowFixMe): $FlowFixMe {
  return x;
}
function bar(x: $FlowFixMe): mixed {
  return x;
}
// param (info only)
function qux(x: $FlowFixMe<number>): $FlowFixMe<number> {
  return x;
}
// ...params are still checked. unknown type
function baz(x: $FlowFixMe<nnumber>): $FlowFixMe<number> {
  return x;
}

var x: string = foo(0);
var y: string = bar(0);
var z: string = qux(0);
var w: string = baz(0);

`;

exports[`flowissue.js 1`] = `
/*
  $FlowIssue is a synonym for any, used by JS devs to signal
  a potential typechecker bug to the Flow team.

  @flow
 */

// no param
function foo(x:$FlowIssue):$FlowIssue { return x; }
function bar(x:$FlowIssue):mixed { return x; }
// param (info only)
function qux(x:$FlowIssue<number>):$FlowIssue<number> { return x; }
// ...params are still checked. unknown type
function baz(x:$FlowIssue<nnumber>): $FlowIssue<number> { return x; }

var x:string = foo(0);
var y:string = bar(0);
var z:string = qux(0);
var w:string = baz(0);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
  $FlowIssue is a synonym for any, used by JS devs to signal
  a potential typechecker bug to the Flow team.

  @flow
 */

// no param
function foo(x: $FlowIssue): $FlowIssue {
  return x;
}
function bar(x: $FlowIssue): mixed {
  return x;
}
// param (info only)
function qux(x: $FlowIssue<number>): $FlowIssue<number> {
  return x;
}
// ...params are still checked. unknown type
function baz(x: $FlowIssue<nnumber>): $FlowIssue<number> {
  return x;
}

var x: string = foo(0);
var y: string = bar(0);
var z: string = qux(0);
var w: string = baz(0);

`;

exports[`nonflowfile.js 1`] = `
// @noflow

module.exports = (x) => x;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @noflow

module.exports = x => x;

`;

exports[`propagate.js 1`] = `
// @flow

declare class C {
  bar(n1: number, n2: number): number;
  bar(s1: string, s2: string): string;
}

function foo(c: C, x: any): string {
  let y = x.y;
  return c.bar(0, y); // should be able to select first case and error
}

var any_fun1 = require('./nonflowfile');
function bar1(x: mixed) {
  if (any_fun1(x)) {
    (x: boolean);
  }
}

var any_fun2 = require('./anyexportflowfile');
function bar2(x: mixed) {
  if (any_fun2(x)) {
    (x: boolean);
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @flow

declare class C {
  bar(n1: number, n2: number): number;
  bar(s1: string, s2: string): string;
}

function foo(c: C, x: any): string {
  let y = x.y;
  return c.bar(0, y); // should be able to select first case and error
}

var any_fun1 = require("./nonflowfile");
function bar1(x: mixed) {
  if (any_fun1(x)) {
    (x: boolean);
  }
}

var any_fun2 = require("./anyexportflowfile");
function bar2(x: mixed) {
  if (any_fun2(x)) {
    (x: boolean);
  }
}

`;

exports[`reach.js 1`] = `
/**
 * like class and function values, any-typed values may be used in
 * type annotations. Here we test propagation of any through the
 * annotation - without it, the body of the if will be unreachable
 */

type AsyncRequest = any;

function foo(o: ?AsyncRequest) {
  if (o) {
    var n: number = o;
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
 * like class and function values, any-typed values may be used in
 * type annotations. Here we test propagation of any through the
 * annotation - without it, the body of the if will be unreachable
 */

type AsyncRequest = any;

function foo(o: ?AsyncRequest) {
  if (o) {
    var n: number = o;
  }
}

`;
